// 声明类型
interface _IK_ {
    /**
     * 查找元素（固定值）
     * @param selectors 选择器
     * @description            selectors = 'body'      => document.body
     * @description            selectors = 'head'      => document.head
     * @returns 元素对象
     */
    (selectors: 'body' | 'head'): KHTMLElement;



    /**
     * 创建元素 或 查找符合条件的元素
     * @param tagName_or_selectors 标签名 或 选择器
     * @description tagName_or_selectors = '<div>'      => 创建元素
     * @description tagName_or_selectors = 'div'        => 查找元素 @see HTMLElement.prototype.querySelector
     * @returns 元素对象
     */
    (tagName_or_selectors: string): KHTMLElement;



    /**
     * 查找元素（固定值）
     * @param selectors 选择器
     * @description            selectors = HTMLElement  => 元素对象
     * @description            selectors = KHTMLElement => 元素对象
     * @returns 元素对象
     */
    (selectors: HTMLElement | KHTMLElement): KHTMLElement;



    /**
     * 查找符合条件的元素
     * @param selectors 选择器 @see HTMLElement.prototype.querySelector
     * @param all false: 只查找第一个符合条件的元素;
     * @returns 查找结果元素
     */
    (selectors: string, all: false): KHTMLElement;
    /**
     * 查找符合条件的元素
     * @param selectors 选择器 @see HTMLElement.prototype.querySelectorAll
     * @param all true: 查找所有符合条件的元素;
     * @returns 查找结果元素
     */
    (selectors: string, all: true): KHTMLElement;



    /**
     * 从指定元素 中 查找符合条件的元素
     * @param element 元素
     * @param selectors 选择器 @see HTMLElement.prototype.querySelector
     * @param all false: 只查找第一个符合条件的元素;
     * @returns 查找结果元素
     */
    (element: KHTMLElement, selectors: string, all: false): KHTMLElement;
    /**
     * 从指定元素 中 查找符合条件的元素
     * @param element 元素
     * @param selectors 选择器 @see HTMLElement.prototype.querySelectorAll
     * @param all true: 查找所有符合条件的元素;
     * @returns 查找结果元素
     */
    (element: KHTMLElement, selectors: string, all: true): KHTMLElement;



    /**
     * 从指定元素 中 查找符合条件的元素
     * @param element 元素
     * @param selectors 选择器 @see HTMLElement.prototype.querySelector
     * @param all false: 只查找第一个符合条件的元素;
     * @returns 查找结果元素
     */
    (element: HTMLElement, selectors: string, all: false): KHTMLElement;
    /**
     * 从指定元素 中 查找符合条件的元素
     * @param element 元素
     * @param selectors 选择器 @see HTMLElement.prototype.querySelectorAll
     * @param all true: 查找所有符合条件的元素;
     * @returns 查找结果元素
     */
    (element: HTMLElement, selectors: string, all: true): KHTMLElement;



    /**
     * 创建元素
     * @param tagName 标签名 '<div>'
     * @param options 参数
     * @returns 元素对象
     */
    (tagName: string, options: Tdom_options): KHTMLElement;
}
// 创建实例对象并实现
// 后续的扩展实现，在TS中识别有误。
// @ts-ignore Type 'IoverloadingFN' is missing the following properties from type '_IK_': ... (2739)
const K: _IK_ = U.F.overloading('K',
    {
        types: [Etype.string],
        fn: (tagName_or_selectors: string) => {
            // 使用标签名 则 创建元素
            if (U.R.tagName.test(tagName_or_selectors)) {
                return U.D.createElement(tagName_or_selectors);
            }

            // 其它字符串 则 查找元素
            return new KHTMLElement(document.querySelector(tagName_or_selectors));
        }
    },


    {
        types: [Etype.HTMLElement],
        fn: (selectors: HTMLElement) => {
            return new KHTMLElement(selectors);
        }
    },


    {
        types: [Etype.KHTMLElement],
        fn: (selectors: KHTMLElement) => {
            return selectors;
        }
    },


    {
        types: [Etype.string, Etype.boolean],
        fn: (selectors: string, all: boolean) => {
            return new KHTMLElement(all === true ? document.querySelectorAll(selectors) : document.querySelector(selectors));
        }
    },


    {
        types: [Etype.HTMLElement, Etype.string, Etype.boolean],
        fn: (element: HTMLElement, selectors: string, all: boolean) => {
            return new KHTMLElement(all === true ? element.querySelectorAll(selectors) : element.querySelector(selectors));
        }
    },


    {
        types: [Etype.KHTMLElement, Etype.string, Etype.boolean],
        fn: (element: KHTMLElement, selectors: string, all: boolean) => {
            return element.query(selectors, all as true);// 此处跳过检查，并不是真的为true，实际传入的还是boolean值。
        }
    },


    {
        types: [Etype.string, Etype.obj],
        fn: (tagName: string, options: Tdom_options) => {
            return U.D.createElement(tagName, options);
        }
    },
);
